// 引入所需模块
const express = require('express'); // Express web框架
const http = require('http');       // HTTP模块
const WebSocket = require('ws');    // WebSocket实现
const mongoose = require('mongoose');// MongoDB ORM


/**
 * 连接MongoDB数据库
 * 数据库名称: websocket_demo
 * 默认端口: 27017
 */
mongoose.connect('mongodb://localhost:27017/websocket_demo');

const MessageSchema = new mongoose.Schema({
  content: String,
  createdAt: { type: Date, default: Date.now },
});
const Message = mongoose.model('Message', MessageSchema);

// 初始化Express应用
const app = express();

app.use(express.static('public'));

// 创建HTTP服务器
const server = http.createServer(app);

/**
 * 创建WebSocket服务器
 * 基于HTTP服务器实现
 */
const wss = new WebSocket.Server({ server });

/**
 * WebSocket连接事件处理
 * 当新客户端连接时触发
 */
wss.on('connection', (ws) => {
  console.log('客户端已连接');

  // 发送历史消息
  Message.find().sort({ createdAt: 1 }).limit(50).then((messages) => {
    ws.send(JSON.stringify({ type: 'history', data: messages }));
  });

  ws.on('message', async (message) => {
    console.log('收到消息:', message);
    // 存储消息到数据库
    const msg = new Message({ content: message });
    await msg.save();
    // 广播消息给所有客户端
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify({ type: 'message', data: msg }));
      }
    });
  });

  ws.on('close', () => {
    console.log('客户端已断开连接');
  });
});

/**
 * HTTP路由 - 根路径
 * 返回服务器状态信息
 */
app.get('/', (req, res) => {
  res.send('WebSocket 服务器已启动');
});




const PORT = 3000;
server.listen(PORT, () => {
  console.log(`服务器已启动，端口：${PORT}`);
});
